// START: EVENT SETTING

/** EventSetting 示例：

[
  {
    "key": "NEED_LOCATION",
    "value": {
      "enabled": true,
      "config": {
        "accuracy": "high",
        "timeout": 30000
      }
    }
  },
  {
    "key": "NEED_PHOTO",
    "value": {
      "enabled": true,
      "config": {
        "maxSize": 5242880,
        "allowedFormats": ["jpg", "png"]
      }
    }
  },
  {
    "key": "NEED_SECRET",
    "value": {
      "enabled": true,
      "config": {
        "secretCode": "ABC123",
        "caseInsensitive": false,
        "maxAttempts": 3
      }
    }
  },
  {
    "key": "NEED_CHECKOUT",
    "value": {
      "enabled": true,
      "config": {
        "timeWindow": 3600000
      }
    }
  },
  {
    "key": "RELATION",
    "value": {
      "type": "OR",
      "keys": [
        {
          "type": "AND",
          "keys": ["NEED_LOCATION", "NEED_SECRET"]
        },
        {
          "type": "AND",
          "keys": ["NEED_PHOTO", "NEED_SECRET"]
        }
      ]
    }
  }
]*/

export enum EventSettingKey {
    NEED_LOCATION = 'NEED_LOCATION',
    NEED_PHOTO = 'NEED_PHOTO',
    NEED_SECRET = 'NEED_SECRET',
    NEED_CHECKOUT = 'NEED_CHECKOUT',
    RELATION = 'RELATION',
    RECURRENCE = 'RECURRENCE',
    TIME_THRESHOLDS = 'TIME_THRESHOLDS',
    CHECK_IN_REQUIREMENTS = 'CHECK_IN_REQUIREMENTS',
    ALLOW_MAKEUP = 'ALLOW_MAKEUP' // 是否允许补签
}

export type RelationType = 'AND' | 'OR'

// 关系配置类型（递归定义）
export type RelationConfig = {
    type: RelationType
    keys: (EventSettingKey | RelationConfig)[]
}

// 定位配置
export type LocationConfig = {
    accuracy?: 'high' | 'medium' | 'low'
    timeout?: number // 超时时间（毫秒）
    allowMock?: boolean // 是否允许模拟位置
}

// 拍照配置
export type PhotoConfig = {
    maxSize?: number // 最大文件大小（字节）
    allowedFormats?: string[] // 允许的格式
    compressionQuality?: number // 压缩质量 0-1
    requireOriginal?: boolean // 是否要求原图
}

// 密钥配置
export type SecretConfig = {
    secretCode?: string // 密钥码（如果为空则动态生成）
    caseInsensitive?: boolean // 是否忽略大小写
    maxAttempts?: number // 最大尝试次数
    expiresIn?: number // 过期时间（毫秒）
}

// 签退配置
export type CheckoutConfig = {
    timeWindow?: number // 允许签退的时间窗口（毫秒）
    requireReason?: boolean // 是否需要填写原因
}

// 重复规则配置
export enum RecurrenceFrequency {
    DAILY = 'DAILY', // 每日
    WEEKLY = 'WEEKLY', // 每周
    MONTHLY = 'MONTHLY', // 每月
    CUSTOM = 'CUSTOM' // 自定义
}

export type RecurrenceConfig = {
    frequency: RecurrenceFrequency
    interval?: number // 间隔，例如每2天、每3周
    daysOfWeek?: number[] // 周几重复（0=周日，1=周一...6=周六）
    daysOfMonth?: number[] // 每月哪几天重复（1-31）
    endDate?: Date // 重复结束日期
    occurrences?: number // 重复次数（与 endDate 二选一）
}

// 时间阈值配置
export type TimeThresholdsConfig = {
    gracePeriodMinutes: number // 宽限时间（分钟），在此时间内签到视为准时
    lateThresholdMinutes: number // 迟到判定阈值（分钟），超过此时间视为迟到
    absentThresholdMinutes: number // 缺席判定阈值（分钟），超过此时间视为缺席
    earlyLeaveThresholdMinutes?: number // 早退判定阈值（分钟），提前离开视为早退
}

// 签到要求强制性配置
export type CheckInRequirementsConfig = {
    locationRequired: boolean // 是否强制定位
    photoRequired: boolean // 是否强制拍照
    secretRequired: boolean // 是否强制输入密钥
    // 逻辑关系：如果设置了 RELATION，则按 RELATION 规则；否则所有 required=true 的都必须满足
}

// 补签设置配置
export type AllowMakeUpConfig = {
    allowCheckIn: boolean // 是否允许补签签到
    allowCheckOut: boolean // 是否允许补签签退
    timeLimitDays?: number // 补签时限（天数），默认 7 天
    requireApproval?: boolean // 是否需要审批，默认 true
    monthlyLimit?: number // 每月补签次数限制，默认 5 次
}

// 通用设置值类型
export type SettingValue<T = any> = {
    enabled: boolean
    config?: T
}

// 单条设置的类型（使用判别联合类型）
export type EventSettings =
    | { key: EventSettingKey.NEED_LOCATION; value: SettingValue<LocationConfig> }
    | { key: EventSettingKey.NEED_PHOTO; value: SettingValue<PhotoConfig> }
    | { key: EventSettingKey.NEED_SECRET; value: SettingValue<SecretConfig> }
    | { key: EventSettingKey.NEED_CHECKOUT; value: SettingValue<CheckoutConfig> }
    | { key: EventSettingKey.RELATION; value: RelationConfig }
    | { key: EventSettingKey.RECURRENCE; value: RecurrenceConfig }
    | { key: EventSettingKey.TIME_THRESHOLDS; value: TimeThresholdsConfig }
    | { key: EventSettingKey.CHECK_IN_REQUIREMENTS; value: CheckInRequirementsConfig }
    | { key: EventSettingKey.ALLOW_MAKEUP; value: AllowMakeUpConfig }

// 辅助类型：获取特定 key 的配置类型
export type EventSettingConfig<K extends EventSettingKey> = Extract<EventSettings, { key: K }>['value']
